package com.ladlee.mobile;

import lombok.Data;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.InternalAuthenticationServiceException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.util.StringUtils;

/**
 * @Auther: dingchang
 * @Date: 2018/12/27 10:14
 * @Description: 短信登录验证逻辑
 */
@Data
public class SmsAuthenticationProvider implements AuthenticationProvider {

    private UserDetailsService userDetailsService;

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        //构建Authentication的子类（我们自己定义SmsAuthenticationToken）
        SmsAuthenticationToken smsAuthenticationToken = (SmsAuthenticationToken) authentication;
        //获取用户信息
        UserDetails user = userDetailsService.loadUserByUsername((String) smsAuthenticationToken.getPrincipal());
        if (user == null || StringUtils.isEmpty(user.getUsername())){
            throw new InternalAuthenticationServiceException("无法获取用户信息");
        }
        //如果用户信息不为空，则重新构建SmsAuthenticationToken（已认证的）
        SmsAuthenticationToken result  = new SmsAuthenticationToken(user.getAuthorities(),user);
        //设置详情
        result.setDetails(smsAuthenticationToken.getDetails());
        return result;
    }

    /**
     * class1.isAssignableFrom(class2) 判定此 Class 对象所表示的类或接口与指定的 Class 参数所表示的类或接口是否相同，或是否是其超类或超接口。
     * 如果是则返回 true；否则返回 false。如果该 Class 表示一个基本类型，且指定的 Class 参数正是该 Class 对象，则该方法返回 true；否则返回 false。
     * 1.class2是不是class1的子类或者子接口
     * @param authentication
     * @return
     */
    @Override
    public boolean supports(Class<?> authentication) {
        return SmsAuthenticationToken.class.isAssignableFrom(authentication);//
    }

}
